<?php
/**
 * Abstract.php
 *
 * Momoger_Model_Mapper 抽象类
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://momoger.com/license
 *
 * @category	Momoger
 * @package 	Momoger_Model
 * @subpackage 	Mapper
 * @author 		Leo
 * @version    	1.0
 * @copyright  	Copyright © 2009 www.momoger.com All Rights Reserved.
 * @license    	http://momoger.com/license     New BSD License
 */

/**
 * Momoger_Model_Mapper 抽象类
 *
 * @category 	Momoger
 * @package		Momoger_Model
 * @subpackage 	Mapper
 * @copyright  	Copyright © 2009 www.momoger.com All Rights Reserved.
 * @license    	http://momoger.com/license     New BSD License
 */
abstract class Momoger_Model_Mapper_Abstract {

	/**
	 * 数据表对象
	 *
	 * @var Momoger_Dao_Abstract
	 */
	protected $_dao = null;

    /**
     * 获取数据表模型.
     *
     * @return Momoger_Dao_Abstract
     */
    abstract protected function getDao();

    /**
     * 保存模型数据到 DAO
     *
     * @param Momoger_Model_Abstract $model
     * @return Momoger_Model_Abstract
     */
    abstract public function save(Momoger_Model_Abstract $model);

    /**
     * 保存新数据到DAO
     *
     * @param Momoger_Model_Abstract $model 模型对象
     * @return Momoger_Model_Abstract
     */
    abstract public function insert(Momoger_Model_Abstract $model);

    /**
     * 更新 DAO 现有模型数据
     *
     * @param Momoger_Model_Abstract $model 模型对象
     * @param string|array $where 更新条件
     * @return Momoger_Model_Abstract
     */
    abstract public function update(Momoger_Model_Abstract $model, $where = null);

    /**
     * 删除 该模型 在 DAO 中的数据
     *
     * @param Momoger_Model_Abstract $model 模型对象
     * @param string|array $where 删除条件
     * @return Momoger_Model_Abstract
     */
    abstract public function delete(Momoger_Model_Abstract $model, $where = null);

    /**
     * 更加模型身份ID获取模新保存在数据源中的数据, 成功找到更新模型本身数据.
     *
     * @param Momoger_Model_Abstract $model 模型对象
     * @param int|string $key 模型身份ID
     * @return Momoger_Model_Abstract
     */
    abstract public function find(Momoger_Model_Abstract $model, $key);

    /**
     * 根据条件查找模型保存在数据源中的数据, 成功找到更新模型本身数据.
     *
     * @param Momoger_Model_Abstract $model 模型对象
     * @param string|array $where 过滤条件
     * @param string|array $order 排序条件
     * @return Momoger_Model_Abstract
     */
    public function findRow(Momoger_Model_Abstract $model, $where = null, $order = null) {
    	$row = $this->getDao()->fetchRow($where, $order);
    	if ($row) {
    		$model->set($row->toArray());
    	}
    	return $model;
    }

    /**
     * 根据条件查找模型保存在数据源中的批量数据, 成功找到返回模型数组.
     *
     * @param Momoger_Model_Abstract $model 模型对象
     * @param string|array $where 过滤条件
     * @param string|array $order 排序条件
     * @param int $limit 结果限制
     * @param int $offset 开始位置
     * @return array
     */
    public function findAll(Momoger_Model_Abstract $model, $where = null, $order = null, $limit = 500, $offset = 0){
    	$rows = $this->getDao()->fetchAll($where, $order, $limit, $offset);
    	$entries = array();
    	if ($rows) {
    		foreach ($rows as $row) {
    			$entry = clone $model;
    			$entry->set($row->toArray());
    			array_push($entries, $entry);
    		}
    	}
    	return $entries;
    }

	/**
	 * 获取系统信息记录对象
	 *
	 * @return App_System_Logger
	 */
	protected function logger() {
		return App_System_Logger::getInstance();
	}

	/**
	 * 获取系统缓存对象
	 *
	 * @return App_System_Cache
	 */
	protected function cache() {
		return App_System_Cache::getInstance();
	}

	/**
	 * 设置数据表对象.
	 *
	 * @param Momoger_Dao_Abstract $dao 数据存取模型类名
	 * @return Momoger_Dao_Abstract
	 */
	protected function setDao($dao) {
        if (is_string($dao)) {
            $dao = new $dao();
        }
        if (!$dao instanceof Momoger_Dao_Abstract) {
            throw new Exception('Invalid data access object');
        }
        $this->_dao = $dao;
        return $this;
    }
}